Теперь нам нужно создать объект. Вот так.
IUnknown* pUnk;
hr = pCF->CreateInstance( NULL, IID_IUnknown, (void**) &pUnk );
pCF->Release();
if ( FAILED( hr ))
{
cout << "Failed to create server instance " << endl;
return ;
}
cout << "Instance created" << endl;
Обратите внимание, что для создания объекта мы используем функции фабрики классов. Мы сами описывали в этой функции процесс создания класса. Помните ?? Ну там new используется.
Ну вот и настал момент когда мы можем получить доступ к интерфейсу. Для этого нужно его описание и его IDD, я просто скопировал код описания из проекта сервера, но можно подключить и H файл с описанием интерфейса, но это на любителя. Для нормального проекта нужно конечно подключать заголовочный файл на случай изменений. Ну Вы меня простите. Упрощаю как могу.
#include "windows.h"
#include "iostream.h"
#include "initguid.h"
DEFINE_GUID(IID_Step,
0x3f5942e2, 0x108b, 0x11d4, 0xb0, 0x50, 0x0, 0x0, 0x1, 0x26, 0x6, 0x96);
class IStep : public IUnknown
{
public:
IStep();
virtual ~IStep();
STDMETHOD(MyComMessage) () PURE;
};
void main()
......
Вот так. А теперь мы можем и интерфейс попросить :-)
IStep* pStep = NULL;
hr = pUnk->QueryInterface( IID_Step, (void**) &pStep);
pUnk->Release();
if ( FAILED( hr ))
{
cout << "QueryInterface() for IStep failed" << endl;
CoUninitialize();
return;
}
Как видите мы запрашиваем интерфейс и получаем указатель на наш класс. Теперь можно и методы вызывать.
pStep->MyComMessage(); pStep->Release(); cout << "Shuting down COM" << endl; CoUninitialize();
Вот можно запускать. Функция должна вызваться. У меня работает. Если не получается смотрите проект.
Проще я уже не смогу наверно придумать :-))). Но в этих шагах самые базовые понятие о COM основе OLE, DCOM, ActiveX есть всякие классы и, например, ATL облегчающие работу. Но понимать, что происходит за всем этим тоже интересно. Правда ???